﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _28_Visitor
{
    class Program
    {
        /*
          访问者模式讲的是表示一个作用于某对象结构中的各元素的操作。它是你可以在不改变各元素类的
          前提下定义作用于这些元素的新操作。

          双派分技术，首先在客户程序中将具体状态作为参数传递给男人类完成一次分派，然后男人调用作
          为参数的具体状态中的方法男人反应，同时将自己作参数传递进去。 这边完成第二次派分。 
          双派分意味着得到执行的操作决定于请求的种类和接受者的类型。 ‘接受’方法就是I一个分派的
          操作，它得到执行的操作不仅决定于状态类的具体状态，还决定于它访问的人的类别。
          
          对象结构类 由于总是需要男人和女人 在不同状态的对比，所以我们需要一个 对象结构 来针对不同
          的 状态 遍历 男人和 女人
          
          访问者模式适用于数据结构相对稳定的系统。 他把数据结构和作用于结构上的操作之间的耦合解脱开，
          使得操作集合可以相对自由的演化。

          访问者模式的目的是要把处理从数据结构分离出来。很多系统可以按算法和数据结构分开，如果这样的
          系统有比较稳定的数据结构，又有易于变化的算法的话，使用访问者模式就是比较合适的，因为访问者
          模式使得算法操作的增加变得容易。

          访问者模式的优点是 ：增加新的操作很容易，因为增加新的操作意味着增加一个新的访问者。 访问者
          模式将有关的行为集中到一个访问者对象中。

            缺点算是：使增加新的数据结构变得困难了。 大多数时候并不需要访问者模式，
             */
        static void Main(string[] args)
        {
            ObjectStructure o = new ObjectStructure();
            o.Attach(new Man());
            o.Attach(new Woman());

            Success vl = new Success();
            o.Display(vl);

            Failing v2 = new Failing();
            o.Display(v2);

            Amativeness v3 = new Amativeness();
            o.Display(v3);

            Console.Read();
        }
    }
}
